'use strict';

module.exports = core;

const path = require('path');
const semver = require('semver'); // 比较node版本
const colors = require('colors'); // 字体颜色
const userHome = require('user-home'); // 用户主目录
const commander = require('commander'); // 参数配置
const pathExists = require('path-exists').sync; // 目录是否存在
const log = require('@gok-cli/log');
const exec = require('@gok-cli/exec');
const pkg = require('../package.json');
const contstant = require('./const');

const program = new commander.Command(); // 实例化command

async function core() {
    try {
        await prepare();
        registerCommand();
    } catch (error) {
        log.error(error.message);
    }
}

// 注册命令
function registerCommand() {
    program
        .name(Object.keys(pkg.bin)[0])
        .usage('<command> [options]')
        .version(pkg.version) // 配置版本号
        .option('-d, --debug', '是否开启调试模式', false)
        .option('-tp, --targetPath <targetPath>', '是否指定本地调试文件路径', '');
    
    // 命令注册
    program
        .command('init [projectName]')
        .option('-f, --force', '是否强制初始化项目')
        .action(exec);
    
    // 对debug监听
    program.on('option:debug', function () {
        if (program._optionValues.debug) {
            process.env.LOG_LEVEL = 'verbose';
        } else {
            process.env.LOG_LEVEL = 'info';
        }
        log.level = process.env.LOG_LEVEL;
    });

    // 设置环境变量，指定targetPath
    program.on('option:targetPath', function () {
        process.env.CLI_TARGET_PATH = program._optionValues.targetPath
    });

    // 对未知命令的监听
    program.on('command:*', function (obj) {
        const availableCommands = program.commands.map(cmd => cmd.name);
        console.log(colors.red('未知的命令：' + obj[0]))
        if (availableCommands.length > 0) {
            console.log(colors.red('可用命令：' + availableCommands.join(',')));
        }
    });

    // 参数解析
    program.parse(process.argv); 

    // 未输入参数
    if (program.args && program.args.length < 1) { 
        program.outputHelp();
        console.log();
    }
} 

// 检查是否为最新版本
async function checkGlobalUpdate() {
    const currentVersion = pkg.version;
    const npmName = pkg.name;
    const { getNpmSemverVersion } = require('@gok-cli/get-npm-info')
    const lastVersion = await getNpmSemverVersion(currentVersion, npmName)
    if (lastVersion && semver.gt(lastVersion, currentVersion)) {
        log.warn(colors.yellow(`请手动更新 ${npmName}，当前版本：${currentVersion}，最新版本：${lastVersion}
                               | 更新命令：npm install -g ${npmName}`))
    }
}

// 方法执行
async function prepare() {
    checkPkgVersion();
    checkRoot();
    checkUserHome();
    checkEnv();
    await checkGlobalUpdate();
}

// 检查环境变量
function checkEnv() {
    const dotenv = require('dotenv');
    const dotenvPath = path.resolve(userHome, '.env');
    if (pathExists(dotenvPath)) {
        dotenv.config({
            path: dotenvPath,
        })
    }
    createDefaultConfig();
}

// 创建CLI_HOME 默认配置
function createDefaultConfig() {
    const cliConfig = {
        home: userHome,
    };
    if (process.env.CLI_HOME) {
        cliConfig['cliHome'] = path.join(userHome, process.env.CLI_HOME);
    } else {
        cliConfig['cliHome'] = path.join(userHome, contstant.DEFAULT_CLI_HOME);
    }
    process.env.CLI_HOME_PATH = cliConfig.cliHome;
}

// 检查当前package版本号
function checkPkgVersion() {
    log.notice('Gok-cli Version', pkg.version)
}


// 检查root
function checkRoot() {
    const rootCheck = require('root-check'); // root检查 降级
    rootCheck();
}

// 检查用户主目录
function checkUserHome() {
    if (!userHome || !pathExists(userHome)) {
        throw new Error(colors.red('当前登录用户主目录不存在! '))
    }
}



